package com.tgy.util;

import org.springframework.mock.web.MockMultipartFile;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: tianGuiYin
 * @date: 2021/11/26 11:17
 */
public class FileUtil {

    /**
     * 获取路径下的所有文件/文件夹
     * @Param directoryPath 需要遍历的文件夹路径
     * @Param isAddDirectory 是否将子文件夹的路径也添加到list集合中
     * @Param suffix         指定文件后缀，多个以都好分割。如果为空则所有类型文件都查询
     * @author: tianGuiYin
     * @date: 2021/11/24 16:41
     **/
    public static List<String> getAllFile(String directoryPath, boolean isAddDirectory, String suffix) {
        List<String> list = new ArrayList<String>();
        File baseFile = new File(directoryPath);
        if (baseFile.isFile() || !baseFile.exists()) {
            return list;
        }
        File[] files = baseFile.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                if(isAddDirectory){
                    list.add(file.getAbsolutePath());
                }
                list.addAll(getAllFile(file.getAbsolutePath(),isAddDirectory,suffix));
            } else {
                //文件满足后缀要求将路劲添加到list
                if (StringUtils.isEmpty(suffix) || suffix.contains(getSuffix(file.getAbsolutePath()))){
                    list.add(file.getAbsolutePath());
                }
            }
        }
        return list;
    }

    /**
     * 获取路径下的所有文件/文件夹
     * @Param directoryPath 需要遍历的文件夹路径
     * @Param isAddDirectory 是否将子文件夹的路径也添加到list集合中
     * @Param suffix         指定文件后缀，多个以都好分割。如果为空则所有类型文件都查询
     * @Param name           排除名称中包含该字符的
     * @author: tianGuiYin
     * @date: 2021/11/24 16:41
     **/
    public static List<String> getAllFile(String directoryPath, boolean isAddDirectory, String suffix,String name) {
        List<String> list = new ArrayList<String>();
        File baseFile = new File(directoryPath);
        if (baseFile.isFile() || !baseFile.exists()) {
            return list;
        }
        File[] files = baseFile.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                if(isAddDirectory){
                    list.add(file.getAbsolutePath());
                }
                list.addAll(getAllFile(file.getAbsolutePath(),isAddDirectory,suffix,name));
            } else {
                //文件满足后缀要求将路劲添加到list
                if ((StringUtils.isEmpty(suffix) || suffix.contains(getSuffix(file.getAbsolutePath()))) && !file.getName().contains(name)){
                    list.add(file.getAbsolutePath());
                }
            }
        }
        return list;
    }

    /**
     * 获取某个文件的创建时间戳，获取失败返回最后修改时间的时间戳
     * @Param [filePath]
     * @author: tianGuiYin
     * @date: 2021/11/24 16:38
     **/
    public static Long getFileCreatTime(String filePath){
        File file = new File(filePath);
        try {
            Path path = Paths.get(filePath);
            BasicFileAttributeView attributeView =
                    Files.getFileAttributeView(path,BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
            BasicFileAttributes attributes = attributeView.readAttributes();
            //创建时间
            return attributes.creationTime().toMillis();
        }catch (Exception e){
            e.printStackTrace();
            //最后修改时间
            return file.lastModified();
        }
    }

    /**
     * 根据文件路劲获取文件名称
     * @Param [path]
     * @return java.lang.String
     * @author: tianGuiYin
     * @date: 2021/11/24 16:54
     **/
    public static String getFileName(String path){
        return path.substring(path.lastIndexOf("\\")+1);
    }

    /**
     * 根据文件路劲获取文件后缀名,不带.的
     * @Param [path]
     * @return java.lang.String
     * @author: tianGuiYin
     * @date: 2021/11/24 16:54
     **/
    public static String getSuffix(String path){
        return path.substring(path.lastIndexOf(".")+1);
    }

    /**
     * 将File转换成MultipartFile
     * @Param [file]
     * @return org.springframework.web.multipart.MultipartFile
     * @author: tianGuiYin
     * @date: 2021/11/25 15:42
     **/
    public static MultipartFile fileToMultipartFile(File file) throws IOException {
        InputStream inputStream = new FileInputStream(file);
        return new MockMultipartFile(file.getName(), inputStream);
    }

    /**
     * 将MultipartFile转换成File。需要生成一个file
     * 最好将返回的file使用一个数组装好，方便deleteLocalTempFiles删除
     * @Param [multipartFile]
     * @return java.io.File
     * @author: tianGuiYin
     * @date: 2021/11/25 15:43
     **/
    public static File multipartFileToFile(MultipartFile multipartFile,String url) throws IOException {
        //文件夹不存在先创建路劲的文件夹
        File pFile = new File(url);
        if (!pFile.exists()) {
            pFile.mkdirs();
        }
        //生成文件
        String tempFilePath = url + multipartFile.getName();
        File file = new File(tempFilePath);
        multipartFile.transferTo(file);
        return file;
    }

    /**
     * 删除生成的临时文件
     * @Param [files]
     * @return void
     * @author: tianGuiYin
     * @date: 2021/11/25 15:56
     **/
    private static void deleteLocalTempFiles(File[] files) {
        for(int i=0;i<files.length;i++){
            if(files[i].exists()){
                files[i].delete();
            }
        }
    }

    /**
     * 通过文件路径直接修改文件名(只需要传名字进来即可)
     * @param filePath    需要修改的文件的完整路径
     * @param newFileName 需要修改的文件的名称
     * @return
     */
    public static String updateFileName(String filePath, String newFileName) {
        File f = new File(filePath);
        if (!f.exists()) { // 判断原文件是否存在（防止文件名冲突）
            return null;
        }
        newFileName = newFileName.trim();
        if ("".equals(newFileName) || newFileName == null) // 文件名不能为空
            return null;
        String newFilePath = null;
        if (f.isDirectory()) { // 判断是否为文件夹
            newFilePath = filePath.substring(0, filePath.lastIndexOf("\\")) + "\\" + newFileName;
        } else {
            newFilePath = filePath.substring(0, filePath.lastIndexOf("\\")) + "\\" + newFileName
                    + filePath.substring(filePath.lastIndexOf("."));
        }
        File nf = new File(newFilePath);
        try {
            f.renameTo(nf); // 修改文件名
        } catch (Exception err) {
            err.printStackTrace();
            return null;
        }
        return newFilePath;
    }

    /**
     * 根据文件路劲/文件名返回新的文件名称（新名词规则=老名称+name）
     * @author: tianGuiYin
     * @date: 2021/11/19 10:29
     **/
    public static String getNewFileName(String filePath,String name){
        String fileName = filePath.substring(filePath.lastIndexOf('\\')+1,filePath.lastIndexOf('.'));
//        String suffix = filePath.substring(filePath.lastIndexOf('.'));
        return fileName+name;
    }

}
